#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;

void handler(int signo)
{
    cout << "收到了" << signo << "号信号" << endl;
}

void PrintSignal(const sigset_t &set)
{
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&set, i))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

int main()
{
    signal(2, handler);
    cout << "当前pid:" << getpid() << endl;

    // 1. 屏蔽2号信号
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    sigaddset(&set, 2);
    sigprocmask(SIG_BLOCK, &set, &oset);

    // 2. 让进程获取现在的pending
    sigset_t pending;
    int cut = 0;
    while (true)
    {
        sigpending(&pending);
        PrintSignal(pending);
        cut++;
        sleep(1);
        if (cut == 5)
        {
            // 3. 解除屏蔽
            cout << "已解除屏蔽" << endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr);
            sigpending(&pending);
            PrintSignal(pending);
            sleep(1);
        }
    }

    while (true)
        sleep(1);

    return 0;
}

// int main()
// {
//     cout << "pid:" << getpid() << endl;
//     signal(2, handler);
//     signal(3, SIG_IGN);
//     signal(4, SIG_DFL);
//     while (true)
//         ;
//     return 0;
// }

// int main()
// {
//     signal(14, handler);
//     alarm(2);
//     while(true)
//         cnt++;
//     return 0;
// }

// int main()
// {
//     signal(8, handler);
//     int a = 10 / 0;
//     return 0;
// }

// int main()
// {
//     int *p = nullptr;
//     *p = 1;
//     return 0;
// }

// int main()
// {
//     signal(6, handler);
//     cout << "准备终止" << endl;
//     sleep(2);
//     abort();
//     return 0;
// }

// int main()
// {
//     signal(2, handler);
//     while(true)
//     {
//         raise(2);
//         sleep(1);
//     }
//     return 0;
// }

// kill系统调用的使用
// ./process -9 [pid]
// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         cout << "用法错误" << endl;
//         return 1;
//     }
//     int signnumber = stoi(argv[1] + 1);
//     pid_t processid = stoi(argv[2]);
//     kill(processid, signnumber);
//     return 0;
// }

// void handler(int singno)
// {
//     cout << "这是" << singno << "号信号" << endl;
//     exit(1);
// }

// int main()
// {
//     signal(2, handler);
//     signal(3, handler);

//     while(true)
//     {
//         cout << "我的进程pid是" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }